<?php

/**
 * http、https通信类
 * ============================================================================
 * api说明：
 * setReqContent($reqContent),设置请求内容，无论post和get，都用get方式提供
 * getResContent(), 获取应答内容
 * setMethod($method),设置请求方法,post或者get
 * getErrInfo(),获取错误信息
 * setCertInfo($certFile, $certPasswd, $certType="PEM"),设置证书，双向https时需要使用
 * setCaInfo($caFile), 设置CA，格式未pem，不设置则不检查
 * setTimeOut($timeOut)， 设置超时时间，单位秒
 * getResponseCode(), 取返回的http状态码
 * call(),真正调用接口
 * ============================================================================
 */
class PayHttpClient {
    // 请求内容，无论post和get，都用get方式提供
    var $reqContent = array();
    // 应答内容
    var $resContent;
    
    // 错误信息
    var $errInfo;
    
    // 超时时间
    var $timeOut;
    
    // http状态码
    var $responseCode;
    function __construct() {
        $this->PayHttpClient();
    }
    function PayHttpClient() {
        $this->reqContent = "";
        $this->resContent = "";
        
        $this->errInfo = "";
        
        $this->timeOut = 120;
        
        $this->responseCode = 0;
    }
    
    // 设置请求内容
    function setReqContent($url, $data) {
        $this->reqContent['url'] = $url;
        $this->reqContent['data'] = $data;
    }
    
    // 获取结果内容
    function getResContent() {
        return $this->resContent;
    }
    
    // 获取错误信息
    function getErrInfo() {
        return $this->errInfo;
    }
    
    // 设置超时时间,单位秒
    function setTimeOut($timeOut) {
        $this->timeOut = $timeOut;
    }
    
    // 执行http调用
    function call() {
        // 启动一个CURL会话
        $ch = curl_init();
        
        // 设置curl允许执行的最长秒数
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeOut);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        // 获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        
        // 发送一个常规的POST请求。
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_URL, $this->reqContent['url']);
        // 要传送的所有数据
        curl_setopt($ch, CURLOPT_POSTFIELDS, $this->reqContent['data']);
        
        // 执行操作
        $res = curl_exec($ch);
        $this->responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        if ($res == NULL) {
            $this->errInfo = "call http err :" . curl_errno($ch) . " - " . curl_error($ch);
            curl_close($ch);
            return false;
        } else if ($this->responseCode != "200") {
            $this->errInfo = "call http err httpcode=" . $this->responseCode;
            curl_close($ch);
            return false;
        }
        
        curl_close($ch);
        $this->resContent = $res;
        
        return true;
    }
    function getResponseCode() {
        return $this->responseCode;
    }
}
?>